﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IndignadoFramework.BackBone.Model;
using IndignadoFramework.DataAccessLayer.EntityModels;
using System.Data.Entity;
using IndignadoFramework.BackBone.DTO;

namespace IndignadoFramework.BackBone.InternalServices.Implementacion
{
    public class MovimientoServicesImpl:MovimientoServices
    {
        public int addMovimiento(MovementModel mov)
        {
            Movimiento movimientoEntity = new Movimiento();

            AutoMapper.Mapper.CreateMap<MovementModel, Movimiento>();
            movimientoEntity = AutoMapper.Mapper.Map(mov, movimientoEntity);

            using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
            {
                context.AddObject("Movimientos", movimientoEntity);
                context.SaveChanges();
            }
            return movimientoEntity.Id;
        }

        public List<MovementModel> getMovimientos()
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            IQueryable<Movimiento> movimientos = from m in context.Movimientos select m;
            List<MovementModel> resultado = new List<MovementModel>();

            foreach (Movimiento movimientoEntity in movimientos)
            {
                MovementModel movimientomodel = new MovementModel();
                AutoMapper.Mapper.CreateMap<Movimiento, MovementModel>();
                movimientomodel = AutoMapper.Mapper.Map(movimientoEntity, movimientomodel);
                resultado.Add(movimientomodel);
            }
            return resultado;
        }
        
        public MovementModel getMovimiento(string host)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            //Busco el movimiento
            IQueryable<Movimiento> movimientos = from m in context.Movimientos where m.MovimientoHost == host select m;

            //Comentado para traer el primer movimiento, descomentar y borrar todo lo de abajo
            if (movimientos.Any())
            {
                Movimiento movimiento = movimientos.SingleOrDefault();

                MovementModel mov = new MovementModel();
                //copio el movimiento
                mov.Id = movimiento.Id;
                mov.MovimientoConstM = movimiento.MovimientoConstM;
                mov.MovimientoConstN = movimiento.MovimientoConstN;
                mov.MovimientoConstX = movimiento.MovimientoConstX;
                mov.MovimientoConstZ = movimiento.MovimientoConstZ;
                mov.MovimientoDescripcion = movimiento.MovimientoDescripcion;
                mov.MovimientoEstiloCSS = movimiento.MovimientoEstiloCSS;
                mov.MovimientoHost = movimiento.MovimientoHost;
                mov.MovimientoLogo = movimiento.MovimientoLogo;
                mov.MovimientoNombre = movimiento.MovimientoNombre;
                mov.MovimientoUbicacionX = movimiento.MovimientoUbicacionX;
                mov.MovimientoUbicacionY = movimiento.MovimientoUbicacionY;
                return mov;
            }
            return null;

            // Descomentar para Azure
            //Movimiento movimiento;

            //if (movimientos.Any())
            //{
            //    movimiento = movimientos.SingleOrDefault();
            //}
            //else
            //{
            //    if (context.Movimientos.Count() == 0)
            //        return null;
            //    movimiento = context.Movimientos.First();
            //}

            //MovementModel mov = new MovementModel();
            ////copio el movimiento
            //mov.Id = movimiento.Id;
            //mov.MovimientoConstM = movimiento.MovimientoConstM;
            //mov.MovimientoConstN = movimiento.MovimientoConstN;
            //mov.MovimientoConstX = movimiento.MovimientoConstX;
            //mov.MovimientoConstZ = movimiento.MovimientoConstZ;
            //mov.MovimientoDescripcion = movimiento.MovimientoDescripcion;
            //mov.MovimientoEstiloCSS = movimiento.MovimientoEstiloCSS;
            //mov.MovimientoHost = movimiento.MovimientoHost;
            //mov.MovimientoLogo = movimiento.MovimientoLogo;
            //mov.MovimientoNombre = movimiento.MovimientoNombre;
            //mov.MovimientoUbicacionX = movimiento.MovimientoUbicacionX;
            //mov.MovimientoUbicacionY = movimiento.MovimientoUbicacionY;
            //return mov;
        }

        public MovementModel getMovimiento(int movimientoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            //Busco el movimiento
            Movimiento movimiento = (from m in context.Movimientos where m.Id == movimientoId select m).SingleOrDefault();

            MovementModel mov = new MovementModel();
            //copio el movimiento
            mov.Id = movimiento.Id;
            mov.MovimientoConstM = movimiento.MovimientoConstM;
            mov.MovimientoConstN = movimiento.MovimientoConstN;
            mov.MovimientoConstX = movimiento.MovimientoConstX;
            mov.MovimientoConstZ = movimiento.MovimientoConstZ;
            mov.MovimientoDescripcion = movimiento.MovimientoDescripcion;
            mov.MovimientoEstiloCSS = movimiento.MovimientoEstiloCSS;
            mov.MovimientoHost = movimiento.MovimientoHost;
            mov.MovimientoLogo = movimiento.MovimientoLogo;
            mov.MovimientoNombre = movimiento.MovimientoNombre;
            mov.MovimientoUbicacionX = movimiento.MovimientoUbicacionX;
            mov.MovimientoUbicacionY = movimiento.MovimientoUbicacionY;
            return mov;
        }

        public byte[] getCSS(int movimientoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            //Busco el movimiento
            Movimiento movimiento = (from m in context.Movimientos where m.Id == movimientoId select m).SingleOrDefault();
            return movimiento.MovimientoEstiloCSS;
        }

        public byte[] getLogo(int movimientoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            //Busco el movimiento
            Movimiento movimiento = (from m in context.Movimientos where m.Id == movimientoId select m).SingleOrDefault();
            return movimiento.MovimientoLogo;
        }

        public ImagenModelDTO getContenidoImagen(int movimientoId, int usuarioId, int contenidoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            //Busco el movimiento
            Imagen contenido = (Imagen)(from c in context.Contenidos 
                                      where c.MovimientoId == movimientoId
                                      where c.UsuarioId == usuarioId
                                      where c.Id == contenidoId
                                      select c).SingleOrDefault();
            ImagenModelDTO imagen = new ImagenModelDTO();
            AutoMapper.Mapper.CreateMap<Imagen, ImagenModelDTO>();
            imagen = AutoMapper.Mapper.Map(contenido, imagen);
            return imagen;
        }

        public VideoModelDTO getContenidoVideo(int movimientoId, int usuarioId, int contenidoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            //Busco el movimiento
            Video contenido = (Video)(from c in context.Contenidos
                                        where c.MovimientoId == movimientoId
                                        where c.UsuarioId == usuarioId
                                        where c.Id == contenidoId
                                        select c).SingleOrDefault();
            VideoModelDTO video = new VideoModelDTO();
            AutoMapper.Mapper.CreateMap<Video, VideoModelDTO>();
            video = AutoMapper.Mapper.Map(contenido, video);
            return video;
        }

        public bool modificarMovimiento(MovementModel movimiento)
        {
            bool resultado = true;
            try
            {
                using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
                {
                    Movimiento movimientoEntity = context.Movimientos.First(i => i.Id == movimiento.Id);
                  
                    movimientoEntity.MovimientoConstM = movimiento.MovimientoConstM;
                    movimientoEntity.MovimientoConstN = movimiento.MovimientoConstN;
                    movimientoEntity.MovimientoConstX = movimiento.MovimientoConstX;
                    movimientoEntity.MovimientoConstZ = movimiento.MovimientoConstZ;
                    movimientoEntity.MovimientoDescripcion = movimiento.MovimientoDescripcion;
                    if (movimiento.MovimientoEstiloCSS != null)
                        movimientoEntity.MovimientoEstiloCSS = movimiento.MovimientoEstiloCSS;
                    movimientoEntity.MovimientoHost = movimiento.MovimientoHost;
                    if (movimiento.MovimientoLogo != null)
                        movimientoEntity.MovimientoLogo = movimiento.MovimientoLogo;
                    movimientoEntity.MovimientoNombre = movimiento.MovimientoNombre;
                    movimientoEntity.MovimientoUbicacionX = movimiento.MovimientoUbicacionX;
                    movimientoEntity.MovimientoUbicacionY = movimiento.MovimientoUbicacionY;
                    context.SaveChanges();
                    ContenidoUsuarioServices contenidos = new ContenidoUsuarioServicesImpl();
                    contenidos.deleteContenidos(contenidos.getContenidosInadecuados(true));
                    IEnumerable<UsuarioModelDTO> usuarios = contenidos.updateUsuarios(true);
                }
            }
       
            catch (Exception)
            {
                resultado = false;
            }
            return resultado;
        }

        public void addGaleriaImagenes(int movimientoId, List<ImagenGaleriaModel> imagenes)
        {
            try
            {
                using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
                {
                    Movimiento movimientoEntity = context.Movimientos.First(i => i.Id == movimientoId);
                    foreach (ImagenGaleriaModel imagen in imagenes)
                    {
                        Galeria img = new Galeria();
                        img.GaleriaData = imagen.ImagenData;
                        img.GaleriaFormato = imagen.ImagenFormato;
                        movimientoEntity.Galeria.Add(img);
                    }
                    context.SaveChanges();
                }
            }
            catch (Exception)
            {
                //algo
            }
        }

        public List<int> getListaImagenesGaleria(int movimientoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            Movimiento movimientoEntity = context.Movimientos.First(i => i.Id == movimientoId);
            List<int> resultado = new List<int>();
            foreach (Galeria gal in movimientoEntity.Galeria)
            {
                resultado.Add(gal.Id);
            }
            return resultado;
         }

        public ImagenGaleriaModel getImagenGaleria(int movimientoId, int galeriaId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            Galeria galeria = context.Galerias.First(i => i.MovimientoId == movimientoId && i.Id == galeriaId);
            ImagenGaleriaModel img = new ImagenGaleriaModel();
            img.ImagenData = galeria.GaleriaData;
            img.ImagenFormato = galeria.GaleriaFormato;
            return img;
        }

        public void addCategoriaTematica(int movimientoId, List<string> listaCategoriaTematica)
        {
            using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
            {
                foreach (string categoria in listaCategoriaTematica)
                {
                    CategoriaTematica categoriaTematicaEntity = new CategoriaTematica();
                    categoriaTematicaEntity.CategoriaTematicaNombre = categoria;
                    categoriaTematicaEntity.MovimientoId = movimientoId;
                    context.AddObject("CategoriasTematicas", categoriaTematicaEntity);
                }
                context.SaveChanges();
            }
        }
    }
}
